﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace BioinformaticAlgoritms2014.Rosalind
{
    /// <summary>
    /// Класс содержит примеры решения заданий с сайта Rosalind.
    /// Названия public методов сформированы из Url задания.
    /// Например, пример кода по заданию http://rosalind.info/problems/Iprb/ находится в методе <see cref="Iprb"/>
    /// </summary>
   public class Problems
    {
       public static double Iprb(int k, int m, int n)
       {
           int all = k + m + n;
           int count = (all * (all - 1)) / 2;
           var allA = 0;
           for (int i = 1; i <= k; i++)
           {
               allA += all - i;
           }
           allA = allA * 4;
           allA += m*n*2  + (m * (m - 1) / 2)*3;
           return ((double)allA / (4 * count));

       }

       public static string[] Perm(int n)
       {
           var result = new List<string>();
           result.Add(Fact(n).ToString());
           result.AddRange(GetPermutations(Enumerable.Range(1, n), n).Select(a => a.ToArray().ToCustomString()));
           return result.ToArray();

       }

       private static IEnumerable<String> GetAllPerm(int length)
       {
           if (length <= 0)
               yield break;

           for (int i = 0; i < length; i++)
           {
               string c = (length-i).ToString();
               if (length > 1)
               {
                   foreach (String restWord in GetAllPerm(length - 1))
                       yield return c + restWord;
               }
               else
                   yield return "" + c;
           }
       }
      private static int Fact(int x)
       {
           return (x == 0) ? 1 : x * Fact(x - 1);
       }
      private static IEnumerable<IEnumerable<T>> GetPermutations<T>(IEnumerable<T> list, int length)
      {
          if (length == 1) return list.Select(t => new T[] { t });

          return GetPermutations(list, length - 1)
              .SelectMany(t => list.Where(e => !t.Contains(e)),
                  (t1, t2) => t1.Concat(new T[] { t2 }));
      }
      

    
    }
}
